package com.dp.server;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.CiudadDTO;
import com.dp.client.dto.ContinenteDTO;
import com.dp.client.dto.PaisDTO;
import com.dp.client.servicios.geograficos.IServiciosGeograficos;
import com.dp.server.entities.Almacen;
import com.dp.server.entities.Ciudad;
import com.dp.server.entities.Continente;
import com.dp.server.entities.Pais;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class IServiciosGeograficosImpl extends RemoteServiceServlet implements IServiciosGeograficos{
	private static List <ContinenteDTO> continentes=null;
	private static List <PaisDTO> paises=null;
	private static List <CiudadDTO> ciudades=null;
	
	
	public int RegistraCiudad(Ciudad ciudad)
	{
		try
		{
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			Ciudad c = entityManager.merge(ciudad);
			entityManager.getTransaction().commit();
			entityManager.close();
			return c.getId();
		}
		catch(Exception e)
		{
			return 0;
		}
	}
	static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("some_name_you_choose");

	@Override
	public List<ContinenteDTO> listContinentes(int idAlmacen) {
		// TODO Auto-generated method stub
		if (idAlmacen != -1 ) return listContinentesAlmacen(idAlmacen);
		if(continentes!=null) return continentes;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		List<Continente> lista = entityManager.createQuery("from Continente").getResultList();
		if (lista.size()==0){
			lista = entityManager.createQuery("from Continente").getResultList();
		}
		entityManager.close();
		ArrayList<ContinenteDTO> result = new ArrayList<ContinenteDTO>();
		for(Continente c : lista){
			result.add(new ContinenteDTO(c.getId(),c.getNombre()));
		}
		continentes=result;
		return result;
	}
	
	public List<PaisDTO> listPaises(){
		if (paises!=null) return paises;
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		List<Pais> lista = entityManager.createQuery("from Pais").getResultList();
		entityManager.close();
		paises= new ArrayList<PaisDTO>();
		if (continentes==null) listContinentes(-1);
		for(Pais p : lista){
			ContinenteDTO continente=null;
			for (ContinenteDTO c: continentes){
				if (c.getId()==p.getContinenteId()){
					continente=c;
					break;
				}
			}
			paises.add(new PaisDTO(p.getId(),p.getNombre(),continente));
		}
		return paises;
	}
	
	public List<PaisDTO> listPaises(int idAlmacen,String idContinente){
		ArrayList<PaisDTO> result = new ArrayList<PaisDTO>();
		if (idAlmacen != -1) return listPaisesAlmacen(idAlmacen,idContinente);
		if (continentes==null ) listContinentes(-1);
		if (paises==null) listPaises();
		for(PaisDTO p:paises){
			if (p.getContinente().getId()==Integer.parseInt(idContinente))
				result.add(p);
		}
		return result;
	}
	
	public List<CiudadDTO> listCiudades(){
		if(ciudades!=null)
			return ciudades;
		if (continentes==null) listContinentes(-1);
		if (paises==null) listPaises();
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		List<Ciudad> lista = entityManager.createQuery("from Ciudad").getResultList();
		entityManager.close();
		ArrayList<CiudadDTO> result = new ArrayList<CiudadDTO>();
		for(Ciudad c : lista){
			PaisDTO pais=null;
			for (PaisDTO p:paises){
				if(c.getPaisId()==p.getId()){
					pais=p;
					break;
				}
			}
			result.add(new CiudadDTO( c.getId() , c.getNombre() , pais,c.getLatitud(),c.getLongitud(),c.getIcao(),c.getGmt()) );
		}
		ciudades=result;
		return result;
	}
	
	@Override
	public List<CiudadDTO> listCiudades(int idAlmacen,String idPais) {
		ArrayList<CiudadDTO> result = new ArrayList<CiudadDTO>();
		if (idAlmacen != -1 ) return listCiudadesAlmacen(idAlmacen,idPais);
		if (continentes==null) listContinentes(-1);
		if (paises==null) listPaises();
		if (ciudades==null) listCiudades();
		for(CiudadDTO c:ciudades){
			if (c.getPais().getId()==Integer.parseInt(idPais))
				result.add(c);
		}
		return result;
	}
	
	public CiudadDTO getCiudad(int idCiudad){
		if (continentes==null) listContinentes(-1);
		if (paises==null) listPaises();
		if (ciudades==null) listCiudades();
		CiudadDTO ciudadDTO=null;
		for (CiudadDTO c:ciudades){
			if (c.getId()==idCiudad){
				ciudadDTO=c;
				break;
			}
		}
		return ciudadDTO;
	}

	@Override
	public CiudadDTO getCiudad(String idCiudad) {
		if (ciudades==null) listCiudades();
		for (CiudadDTO c : ciudades){
			if ( c.getId() == Integer.parseInt(idCiudad))
				return c;
		}
		return null;
	}
	
	public int hayCiudad(String Ciudad) {
		if (ciudades==null) listCiudades();
		for (CiudadDTO c : ciudades){
			if ( c.getNombre().equals(Ciudad))
				return c.getId();
		}
		return 0;
	}
	
	public int hayPais(String pais)
	{
		if (paises==null) listPaises();
		for (PaisDTO c : paises){
			if ( c.getNombre().equals(pais))
				return c.getId();
		}
		return 0;
	}
	
	public int RegistraPais(Pais pais)
	{
		try
		{
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			Pais p = entityManager.merge(pais);
			entityManager.getTransaction().commit();
			entityManager.close();
			return p.getId();
		}
		catch (Exception e)
		{
			return 0;
		}
	}
	
	public List<ContinenteDTO> listContinentesAlmacen(int idAlmacen) {
		ArrayList <ContinenteDTO> continentes= new ArrayList <ContinenteDTO> ();
		IServiciosAlmacenImpl serviciosAlmacen=new IServiciosAlmacenImpl ();
		for (AlmacenDTO a: serviciosAlmacen.listAlmacenes() ){
			ContinenteDTO continente=a.getCiudad().getPais().getContinente();
			if (!continentes.contains(continente) && a.getId() != idAlmacen){
				continentes.add(continente);
			}
		}
		return continentes;
	}

	
	public List<PaisDTO> listPaisesAlmacen(int idAlmacen,String idContinente) {
		ArrayList <PaisDTO> paises= new ArrayList <PaisDTO> ();
		IServiciosAlmacenImpl serviciosAlmacen=new IServiciosAlmacenImpl ();
		for ( AlmacenDTO a : (new IServiciosAlmacenImpl () ).listAlmacenes() ){
			PaisDTO pais = a.getCiudad().getPais();
			if (!paises.contains(pais) && pais.getContinente().getId() == Integer.parseInt(idContinente) && a.getId() != idAlmacen)
				paises.add(pais);
		}
		return paises;
	}

	public List<CiudadDTO> listCiudadesAlmacen(int idAlmacen,String idPais) {
		ArrayList <CiudadDTO> ciudades=new ArrayList <CiudadDTO> ();
		IServiciosAlmacenImpl serviciosAlmacen=new IServiciosAlmacenImpl (); 
		for (AlmacenDTO a : serviciosAlmacen.listAlmacenes()){
			CiudadDTO ciudad = a.getCiudad();
			if ( !ciudades.contains(ciudad) && ciudad.getPais().getId() == Integer.parseInt(idPais) && a.getId() != idAlmacen)
				ciudades.add(ciudad);
		}
		return ciudades;
	}
	
	public Almacen hayCodigo(String codigo)
	{
		if (ciudades==null) listCiudades();
		for (CiudadDTO c : ciudades){
			if ( c.getIcao().equals(codigo))
			{
				IServiciosAlmacenImpl almacen = new IServiciosAlmacenImpl();
				return almacen.obtenerId(c.getId());
			}
		}
		return null;
	}
	
	public int gmt(String codigo)
	{
		if (ciudades==null) listCiudades();
		for (CiudadDTO c : ciudades){
			if ( c.getIcao().equals(codigo))
			{
				return c.getGmt();
			}
		}
		return 0;
	}
}
